#!/bin/sh
#
# $Id: opensipsdbctl 8290 2011-08-23 14:14:10Z razvancrainea $
#
# opensips control tool for maintaining opensips databases
#
#===================================================================

PATH=$PATH:/usr/local/sbin/

# for testing only, please don't enable this in production environments
# as this introduce security risks
TEST="false"

### include resource files, if any
if [ -f /etc/opensips/opensipsctlrc ]; then
	. /etc/opensips/opensipsctlrc
fi
if [ -f /usr/local/etc/opensips/opensipsctlrc ]; then
	. /usr/local/etc/opensips/opensipsctlrc
fi
if [ -f ~/.opensipsctlrc ]; then
	. ~/.opensipsctlrc
fi

if [ $TEST = "true" ]; then
	if [ -f ./opensipsctlrc ]; then
		. ./opensipsctlrc
	fi
fi

if [ -z $SHELL_TESTED ] && [ -z $NOHLPRINT ] ; then
	if [ -x /bin/bash ]; then
		# bash is available
		export SHELL_TESTED=yes
		exec /bin/bash $0 $@
	else
		NOHLPRINT=yes
	fi
fi


### version for this script
VERSION='$Revision: 3997 $'

if [ -z "$MYDIR" ] ; then
	MYDIR=`dirname $0`
fi

if [ -z "$MYLIBDIR" ] ; then
	MYLIBDIR="/usr/local/lib/opensips/opensipsctl"
	if [ ! -d "$MYLIBDIR" ]; then
		MYLIBDIR=$MYDIR
	fi
fi


##### ------------------------------------------------ #####
### load base functions
#
if [ -f "$MYLIBDIR/opensipsdbctl.base" ]; then
	. "$MYLIBDIR/opensipsdbctl.base"
else
	echo -e "Cannot load core functions '$MYLIBDIR/opensipsdbctl.base' - exiting ...\n"
	exit -1
fi

#
##### ------------------------------------------------ #####
### DBENGINE
#
unset USED_DBENGINE
if [ -z "$DBENGINE" ] ; then
	merr "database engine not specified, please setup one in the config script"
	exit 1
fi

case $DBENGINE in
	MYSQL|mysql|MySQL)
		if [ -f "$MYLIBDIR/opensipsdbctl.mysql" ]; then
			. "$MYLIBDIR/opensipsdbctl.mysql"
			USED_DBENGINE="mysql"
		else
			merr "could not load the script in $MYLIBDIR/opensipsdbctl.mysql for database engine $DBENGINE"
		fi
		;;
	PGSQL|pgsql|postgres|postgresql|POSTGRESQL)
		if [ -f "$MYLIBDIR/opensipsdbctl.pgsql" ]; then
			. "$MYLIBDIR/opensipsdbctl.pgsql"
			USED_DBENGINE="postgres"
		else
			merr "could not load the script in $MYLIBDIR/opensipsdbctl.pgsql for database engine $DBENGINE"
		fi
		;;
	ORACLE|oracle|Oracle)
		if [ -f "$MYLIBDIR/opensipsdbctl.oracle" ]; then
			. "$MYLIBDIR/opensipsdbctl.oracle"
			USED_DBENGINE="oracle"
		else
			merr "could not load the script in $MYLIBDIR/opensipsdbctl.oracle for database engine $DBENGINE"
		fi
		;;
	DBTEXT|dbtext|textdb)
		if [ -f "$MYLIBDIR/opensipsdbctl.dbtext" ]; then
			. "$MYLIBDIR/opensipsdbctl.dbtext"
			USED_DBENGINE="dbtext"
			DBNAME=$DB_PATH
		else
			merr "could not load the script in $MYLIBDIR/opensipsdbctl.dbtext for database engine $DBENGINE"
		fi
		;;
	DB_BERKELEY|db_berkeley|BERKELEY|berkeley)
		if [ -f "$MYLIBDIR/opensipsdbctl.db_berkeley" ]; then
			. "$MYLIBDIR/opensipsdbctl.db_berkeley"
			USED_DBENGINE="berkeley"
			DBNAME=$DB_PATH
		else
			merr "could not load the script in $MYLIBDIR/opensipsdbctl.db_berkeley for database engine $DBENGINE"
		fi
		;;
esac

if [ -z "$USED_DBENGINE" ] ; then
	merr "database engine not loaded - tried '$DBENGINE'"
	exit 1
else
	mdbg "database engine '$USED_DBENGINE' loaded"
fi


# dump all rows
opensips_dump()  # pars: <database name>
{
	if [ $# -ne 2 ] ; then
		merr "opensips_dump function takes two param"
		exit 1
	fi
	if [ "$USED_DBENGINE" = "oracle" ]; then
		oracle_dump $1 $2
	elif [ "$PW" = "" ] ; then
		$DUMP_CMD $1 > $2
	else
		$DUMP_CMD "-p$PW" $1 > $2
	fi
	if [ "$?" -ne 0 ]; then
			merr "db dump failed"
			exit 1
	fi
	minfo "db dump successful"
}


opensips_restore() #pars: <database name> <filename>
{
	if [ $# -ne 2 ] ; then
		merr "opensips_restore function takes two params"
		exit 1
	fi
	if [ "$USED_DBENGINE" = "oracle" ]; then
		oracle_restore $1 $2
	else
		sql_query $1 < $2
	fi
	if [ "$?" -ne 0 ]; then
			merr "db restore failed"
			exit 1
	fi
	minfo "db restore successful"
}


case $1 in
	migrate)
		if [ "$USED_DBENGINE" != "mysql" ] ; then
			merr "$USED_DBENGINE don't support migrate operation"
			exit 1
		fi
		if [ $# -ne 3 ] ; then
			merr "migrate requires 2 parameters: old and new database"
			exit 1
		fi
		# create new database
		minfo "Creating new Database $3...."
		NO_USER_INIT="yes"
		opensips_create $3
		if [ "$?" -ne 0 ] ; then
			echo "migrate: creating new database failed"
			exit 1
		fi
		# migrate data
		minfo "Migrating data from $2 to $3...."
		migrate_db $2 $3
		minfo "Migration successfully completed."
		exit 0;
		;;
	copy)
		# copy database to some other name
		if [ "$USED_DBENGINE" = "berkeley" -o "$USED_DBENGINE" = "dbtext" ] ; then
			merr "$USED_DBENGINE don't support this operation"
			exit 1
		fi
		shift
		if [ $# -ne 1 ]; then
			usage
			exit 1
		fi
		tmp_file=`mktemp /tmp/opensipsdbctl.XXXXXXXXXX` || exit 1
		opensips_dump $DBNAME $tmp_file
		ret=$?
		if [ "$ret" -ne 0 ]; then
			rm $tmp_file
			exit $ret
		fi
		NO_USER_INIT="yes"
		opensips_create $1
		ret=$?
		if [ "$ret" -ne 0 ]; then
			rm $tmp_file
			exit $ret
		fi
		opensips_restore $1 $tmp_file
		ret=$?
		rm -f $tmp_file
		exit $ret
		;;
	backup)
		if [ "$USED_DBENGINE" = "berkeley" -o "$USED_DBENGINE" = "dbtext" ] ; then
			merr "$USED_DBENGINE don't support this operation"
			exit 1
		fi
		# backup current database
		shift
		if [ $# -ne 1 ]; then
			usage
			exit 1
		fi
		opensips_dump $DBNAME $1
		exit $?
		;;
	restore)
		if [ "$USED_DBENGINE" = "berkeley" -o "$USED_DBENGINE" = "dbtext" ] ; then
			merr "$USED_DBENGINE don't support this operation"
			exit 1
		fi
		# restore database from a backup
		shift
		if [ $# -ne 1 ]; then
			usage
			exit 1
		fi
		opensips_restore $DBNAME $1
		exit $?
		;;
	create)
		# create new database structures
		shift
		if [ $# -eq 1 ] ; then
			DBNAME="$1"
		fi

		opensips_create $DBNAME
		exit $?
		;;
	presence)
		presence_create $DBNAME
		exit $?
		;;
	extra)
		extra_create $DBNAME
		exit $?
		;;
	drop)
		# delete opensips database
		# create new database structures
		shift
		if [ $# -eq 1 ] ; then
			DBNAME="$1"
		fi

		opensips_drop $DBNAME
		exit $?
		;;
	reinit)
		# delete database and create a new one
		# create new database structures
		shift
		if [ $# -eq 1 ] ; then
			DBNAME="$1"
		fi
		opensips_drop $DBNAME
		ret=$?
		if [ "$ret" -ne 0 ]; then
			exit $ret
		fi
		opensips_create $DBNAME
		exit $?
		;;
	bdb|db_berkeley)
		shift
		opensips_berkeley "$@"
		exit $?
		;;
	version)
		echo  "$0 $VERSION"
		;;
	*)
		usage
		exit 1;
		;;
esac
